/**
 * Recife Action Tools - RAT
 * Centro de Inform�tica - CIn - UFPE
 *
 * Biblioteca para Gera��o de Analisador L�xico
 */

package br.ufpe.abaco.ParserGen.lexer;

import br.ufpe.abaco.ParserGen.parser.TerminalSymbol;

public class Token implements java.io.Serializable {

	TerminalSymbol[] classes;
	private String text;
	private int startPos;
	private int endPos;
	private int line = -1;
	private int colunm;
	Token next;
	static final Token EOF =
		new Token(new TerminalSymbol[] { TerminalSymbol.EOF }, "");

	/**
	 * Construtor da classe.
	 * 
	 * @param cl	conjunto de terminais que casam com o token
	 * @param txt	texto contido no token
	 */
	Token(TerminalSymbol cl[], String txt) {
		this.classes = cl;
		this.text = txt;
	}

	/**
	 * Construtor da classe.
	 * 
	 * @param cl		conjunto de terminais que casam com o token
	 * @param txt		texto contido no token
	 * @param startPos	coluna � qual o token pertence na entrada
	 * @param line		linha � qual o token pertence na entrada
	 */
	Token(TerminalSymbol cl[], String txt, int startCol, int line,int start,int end) {
		this.classes = cl;
		this.text = txt;
		this.startPos = start;
		this.line = line;
		this.colunm = start;
		this.endPos = end;
	}

	public String toString() {
		return this.text;//+"["+colunm+","+ endPos + "]";
	}
	public String toString2() {
		String resul = "[";

		for (int c = 0; c < classes.length; c++) {
			if (c > 0) {
				resul += ",";
			}

			resul += classes[c];
		}

		resul += "]";
		resul += "\"" + text + "\"";
		resul += "line: " + line;
		resul += "column: " + startPos;
		
		/*if(line > 0){				
			resul += "column: " + (startPos % line); 
		}*/
				
		if (next != null) {
			resul += " --> " + next;
		}

		return resul;
	}

	/*    boolean isA(int tok) {
	
	        for (int c = 0; c < classes.length; c++) {
	            if (classes[c] == tok) {
	                return true;
	            }
	        }
	
	        return false;
	    }*/

	boolean isA(TerminalSymbol tok) {

		for (int c = 0; c < classes.length; c++) {
			if (classes[c].equals(tok)) {
				return true;
			}
		}

		return false;
	}

	/**
	 * Retorna os terminais que casam com o token.
	 * 
	 * @return	TerminalSymbol[]
	 */
	public TerminalSymbol[] getMatchings() {
		return this.classes;
	}

	/**
	 * Retorna o texto contido no token.
	 * 
	 * @return	String
	 */
	public String getValue() {
		return this.text;
	}

	/**
	 * Retorna a linha � qual pertence o token.
	 * 
	 * @return int	a linha
	 */
	public int getLine() {
		return line;
	}

	/**
	 * Retorna a coluna � qual pertence o token.
	 * 
	 * @return int	a coluna
	 */
	public int getStartPos() {
		return startPos;
	}
	public int getEndPos() {
		return endPos;
	}

	public Token nextToken() {
		return next;
	}
	
}